 package com.swl.juc.lock;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
/*
信号量Semaphore是一个控制访问多个共享资源的计数器，和CountDownLatch一样，其本质上是一个“共享锁”。
信号量Semaphore是一个非负整数（>=1）。
当一个线程想要访问某个共享资源时，它必须要先获取Semaphore，当Semaphore >0时，获取该资源并使Semaphore – 1。
如果Semaphore值 = 0，则表示全部的共享资源已经被其他线程全部占用，线程必须要等待其他线程释放资源。当线程释放资源时，Semaphore则+1
 */
public class SemaphoreTest {
    public static void main(String[] args) {
        //模拟三个就餐位
        Semaphore semaphore = new Semaphore(3);
        //模拟6名顾客
        for(int i = 1;i<=6;i++){
            int finalI = i;
            new Thread(()->{
                try {
                    //占就餐位
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()+"\t抢到就餐位");
                    //吃饭需三秒
                    TimeUnit.SECONDS.sleep(finalI);
                    System.out.println(Thread.currentThread().getName()+"\t就餐"+finalI+"秒，吃饭结束");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    //离开就餐位
                    semaphore.release();
                }
            },String.valueOf(i)).start();
        }
    }
}